/*
1. 创建和初始化
方法	描述	示例
new()	创建空向量	let v: Vec<i32> = Vec::new();
with_capacity()	创建指定容量的空向量	let v = Vec::with_capacity(10);
vec![] 宏	快速创建并初始化向量	let v = vec![1, 2, 3];
from()	从数组或其他集合转换	let v = Vec::from([1, 2, 3]);
2. 添加和删除元素
添加元素
方法	描述	示例
push()	在末尾添加元素	v.push(4);
insert()	在指定位置插入元素	v.insert(1, 99);
append()	合并另一个向量（会清空被合并的向量）	v1.append(&mut v2);
extend()	从迭代器添加多个元素	v.extend([4, 5].iter());
删除元素
方法	描述	示例
pop()	移除并返回最后一个元素	let last = v.pop();
remove()	移除指定位置元素	let elem = v.remove(1);
truncate()	截断到指定长度	v.truncate(2);
clear()	清空向量	v.clear();
drain()	移除指定范围内的元素并返回迭代器	for i in v.drain(1..3) { ... }
3. 访问元素
安全访问
方法	描述	示例
get()	返回 Option<&T>	if let Some(x) = v.get(1) { ... }
first()	获取第一个元素	v.first()
last()	获取最后一个元素	v.last()
直接访问（可能 panic）
方法	描述	示例
[] 索引	直接访问元素	let x = v[1];
get_mut()	获取可变引用	if let Some(x) = v.get_mut(1) { *x = 42; }
4. 查询信息
方法	描述	示例
len()	当前元素数量	let length = v.len();
is_empty()	是否为空	if v.is_empty() { ... }
capacity()	当前容量	let cap = v.capacity();
contains()	是否包含某元素	if v.contains(&5) { ... }
5. 迭代操作
方法	描述	示例
iter()	返回不可变迭代器	for x in v.iter() { ... }
iter_mut()	返回可变迭代器	for x in v.iter_mut() { *x *= 2; }
into_iter()	消费向量返回迭代器	for x in v.into_iter() { ... }
6. 排序和搜索
方法	描述	示例
sort()	升序排序（稳定排序）	v.sort();
sort_unstable()	升序排序（更快但不稳定）	v.sort_unstable();
sort_by()	自定义排序	`v.sort_by(	a, b	b.cmp(a));`
binary_search()	二分查找（需先排序）	let idx = v.binary_search(&5);
7. 内存管理
方法	描述	示例
reserve()	预留额外容量	v.reserve(10);
shrink_to_fit()	缩减容量到实际大小	v.shrink_to_fit();
resize()	调整向量大小	v.resize(5, 0);
resize_with()	使用闭包初始化新元素	`v.resize_with(5,		rand::random());`
8. 转换方法
方法	描述	示例
as_slice()	转为切片	let s = v.as_slice();
as_mut_slice()	转为可变切片	let s = v.as_mut_slice();
to_vec()	克隆向量（需元素实现Clone）	let v2 = v.to_vec();
into_boxed_slice()	转为堆分配的切片	let boxed = v.into_boxed_slice();
9. 特殊操作
方法	描述	示例
retain()	保留满足条件的元素	`v.retain(	x	*x > 2);`
dedup()	移除连续重复元素	v.dedup();
split_off()	从指定位置分割向量	let v2 = v.split_off(2);
swap_remove()	移除元素并用最后一个元素填充（不保持顺序）	v.swap_remove(1);
*/
#[derive(Debug)]
struct Person {
    name: String,
    id: u32,
}

fn main() {
    {
        let mut tmpvec = vec![40, 71, 33, 1, 8, 2, 9, 5, 0, 6];
        tmpvec.sort();
        println!("[{},{}]{:?}", file!(), line!(), tmpvec);
        match tmpvec.binary_search(&6) {
            Ok(index) => println!("find,index={}", index),
            Err(_) => println!("not find"),
        }
    }
    {
        let mut tmpvec = vec![
            Person { name: "Alice".to_string(), id: 10 },
            Person { name: "Bob".to_string(), id: 25 },
            Person { name: "Charlie".to_string(), id: 35 },
            Person { name: "d".to_string(), id: 20 },
            Person { name: "e".to_string(), id: 61 },
            Person { name: "f".to_string(), id: 5 },
        ];
        // |a, b| a.id.cmp(&b.id) 匿名函数！
        tmpvec.sort_by(|a, b| a.id.cmp(&b.id));
        println!("[{},{}]{:?}", file!(), line!(), tmpvec);
        match tmpvec.binary_search_by(|a| a.id.cmp(&20)) {
            Ok(index) => {
                println!("find,val={:?}", tmpvec[index]);
                println!("find,name={}", tmpvec[index].name);
            }
            Err(_) => println!("not find"),
        }
    }
}
